package com.supermarket.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.supermarket.dto.ProductPageQueryDto;
import com.supermarket.entity.Product;
import com.supermarket.exception.BusinessException;
import com.supermarket.mapper.ProductMapper;
import com.supermarket.service.ProductService;
import com.supermarket.utils.PageResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;

@Service
@Slf4j
public class ProductServiceImpl implements ProductService {

    @Autowired
    private ProductMapper productMapper;

    /**
     * 分页查询商品列表
     */
    @Override
    public PageResult list(ProductPageQueryDto productPageQueryDto) {
        // 设置默认分页参数
        if (productPageQueryDto.getPage() == null) {
            productPageQueryDto.setPage(1);
        }
        if (productPageQueryDto.getPageSize() == null) {
            productPageQueryDto.setPageSize(1000); // 设置一个较大的值，以便获取所有数据
        }

        // 计算分页参数
        PageHelper.startPage(productPageQueryDto.getPage(), productPageQueryDto.getPageSize());

        // 执行查询
        Page<Product> page = (Page<Product>) productMapper.list(productPageQueryDto);

        return new PageResult(page.getTotal(), page.getResult());
    }

    /**
     * 根据id查询商品
     */
    @Override
    public Product getById(Long id) {
        Product product = productMapper.getById(id);
        if (product == null) {
            throw new BusinessException("商品不存在");
        }
        return product;
    }

    /**
     * 新增商品
     */
    @Override
    @Transactional
    public void save(Product product) {
        // 校验商品数据
        checkProductData(product);

        // 设置默认值
        product.setStatus(1); // 默认上架

        productMapper.insert(product);
    }

    /**
     * 更新商品
     */
    @Override
    @Transactional
    public void update(Product product) {
        // 校验商品是否存在
        getById(product.getId());

        // 校验商品数据
        checkProductData(product);

        productMapper.update(product);
    }

    /**
     * 删除商品
     */
    @Override
    @Transactional
    public void delete(Long id) {
        // 校验商品是否存在
        Product product = getById(id);

        // 只能删除下架的商品
        if (product.getStatus() == 1) {
            throw new BusinessException("只能删除已下架的商品");
        }

        productMapper.deleteById(id);
    }

    /**
     * 更新商品状态
     */
    @Override
    @Transactional
    public void updateStatus(Long id, Integer status) {
        // 校验商品是否存在
        getById(id);

        // 校验状态值
        if (status != 0 && status != 1) {
            throw new BusinessException("非法的状态值");
        }

        productMapper.updateStatus(id, status);
    }

    /**
     * 校验商品数据
     */
    private void checkProductData(Product product) {
        if (product.getPrice() == null || product.getPrice().compareTo(BigDecimal.ZERO) <= 0) {
            throw new BusinessException("商品价格必须大于0");
        }

        if (product.getStock() == null || product.getStock() < 0) {
            throw new BusinessException("商品库存不能小于0");
        }

        if (product.getCategoryId() == null) {
            throw new BusinessException("必须选择商品分类");
        }
    }
}
